/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package matematicadiscretaxml;

import arbol_prueba.BTree;
import arbol_prueba.BTreeException;
import java.util.ArrayList;
import java.util.Stack;

/**
 *
 * @author diego
 */
public class From {

    ArrayList lista_lexemas = new ArrayList();
    private ArrayList lista_errores_from = new ArrayList();

    Stack pila_pal_reserv = new Stack();
    Stack pila_identifica = new Stack();
    Stack pila_simbolos = new Stack();

    public From(){}

    public From(ArrayList _lista_lexemas)
    {
        lista_lexemas = _lista_lexemas;
    }

    public void ingresarPilas()
    {
        boolean bandera_from = false;
        boolean bandera_where = false;
        boolean bandera_error = false;


        for(int i = 0; i < lista_lexemas.size(); i++)
        {
            if(!bandera_error)
            {
                if( ((Lexema)lista_lexemas.get(i)).getLexema().toLowerCase().equals("from") )
                {
                    bandera_from = true;
                }
                else if(((Lexema)lista_lexemas.get(i)).getLexema().toLowerCase().equals("where"))
                {
                    bandera_where = true;
                }

                if(bandera_from == true && bandera_where == false)
                {
                    switch( ((Lexema)lista_lexemas.get(i)).getTipo_lexema() )
                    {
                        /*
                         * AQUI DEBE HABER UN ELSE YA QUE SOLO DEBEN HABER
                         * IDENTIFICADORES(NOMBRES DE TABLAS), SIMBOLOS Y PALABRAS RESERVADAS
                         */
                        case 1:
                            if( ((Lexema)lista_lexemas.get(i)).getLexema().toLowerCase().equals("from") )
                            {
                                pila_pal_reserv.push(lista_lexemas.get(i));
                            }
                            else
                            {
                                bandera_error = true;
                                lista_errores_from.add(new Error("SENTENCIA SELECCION", "EXISTEN PALABRAS RESERVADAS NO PERMITIDAS EN FROM"));
                            }
                            break;
                        case 2:
                            if( ((Lexema)lista_lexemas.get(i)).getLexema().toLowerCase().equals(",") )
                            {
                                pila_simbolos.push(lista_lexemas.get(i));
                            }
                            else
                            {
                                bandera_error = true;
                                lista_errores_from.add(new Error("SENTENCIA SELECCION", "EXISTEN UN SIMBOLO NO PERMITIDO EN FROM"));
                            }
                            break;
                        case 4:
                            pila_identifica.push(lista_lexemas.get(i));
                            break;
                        default:
                            bandera_error = true;
                            lista_errores_from.add(new Error("SENTENCIA SELECCION", "EXISTEN UN SIMBOLO NO PERMITIDO EN FROM"));
                            break;
                    }
                }
            }
            
        }
        if(!bandera_from)
        {
            lista_errores_from.add(new Error("SENTENCIA SELECCION", "NO SE ENCONTRO LA SENTENCIA FROM"));
        }
    }

    
    public BTree generarSubArbolFrom(BTree nodo_padre)
    {
        BTree nodo_aux = new BTree(null);

        if(nodo_padre.getElement() == "nulo")
        {
            nodo_aux = new BTree(pila_pal_reserv.pop());
            if( ((Lexema)nodo_aux.getElement()).getLexema().toLowerCase().equals("from") )
            {
                try
                {
                    /*
                     * AQUI SE DEBE HACER LA PRIMERA LLAMADA RECURSIVA
                     */
                    if(!pila_simbolos.empty())
                    {
                        nodo_aux.insertar(generarSubArbolFrom(nodo_aux), BTree.LADO_DRCHO);
                        nodo_aux.insertar(generarSubArbolFrom(nodo_aux), BTree.LADO_IZDO);
                    }
                    else
                    {
                        nodo_aux.insertar(generarSubArbolFrom(nodo_aux), BTree.LADO_IZDO);
                        nodo_aux.insertar(new BTree(new Lexema(0, null)), BTree.LADO_DRCHO);
                    }
                }
                catch (BTreeException ex)
                {
                    System.out.println(ex.getMessage());
                }
            }
            else
            {
                lista_errores_from.add(new Error("BLOQUE FROM", "NO COMIENZA CON LA PALABRA FROM"));
            }

        }
        else
        {
            /*
             * AQUI SE VERIFICA QUE LA PILA DE SIMBOLOS NO ESTE VACIA
             */
            if(!pila_simbolos.empty())
            {
                if( (((Lexema)nodo_padre.getElement()).getLexema()).toLowerCase().equals("from") )
                {
                    if(nodo_padre.getDerecha() == null)
                    {
                        nodo_aux = new BTree(new Lexema(0, null));
                    }
                    else
                    {
                        if( !pila_simbolos.isEmpty())
                        {
                            nodo_aux = new BTree(pila_simbolos.pop());
                            try
                            {
                                nodo_aux.insertar(generarSubArbolFrom(nodo_aux), BTree.LADO_DRCHO);
                                nodo_aux.insertar(generarSubArbolFrom(nodo_aux), BTree.LADO_IZDO);
                            }
                            catch (BTreeException ex)
                            {
                                System.out.println(ex.getMessage());
                            }
                        }
                        else
                        {
                            if( !pila_identifica.isEmpty())
                            {
                                nodo_aux = new BTree(pila_identifica.pop());
                            }
                            else
                            {
                                lista_errores_from.add(new Error("BLOQUE FROM", "NO COMIENZA CON LA PALABRA FROM"));
                            }
                        }

                    }
                }
                else
                {
                    if(nodo_padre.getDerecha() == null)
                    {
                        if(!pila_identifica.isEmpty())
                        {
                            nodo_aux = new BTree(pila_identifica.pop());
                        }
                        else
                        {
                            lista_errores_from.add(new Error("BLOQUE FROM", "EXISTE UNA COMA MAL UBICADA"));
                        }
                    }
                    else
                    {
                        if(!pila_simbolos.isEmpty())
                        {
                            nodo_aux = new BTree(pila_simbolos.pop());
                            try
                            {
                                nodo_aux.insertar(generarSubArbolFrom(nodo_aux), BTree.LADO_DRCHO);
                                nodo_aux.insertar(generarSubArbolFrom(nodo_aux), BTree.LADO_IZDO);
                            }
                            catch (BTreeException ex)
                            {
                                System.out.println(ex.getMessage());
                            }
                        }
                        else
                        {
                            if(!pila_identifica.isEmpty())
                            {
                                nodo_aux = new BTree(pila_identifica.pop());
                            }
                            else
                            {
                                lista_errores_from.add(new Error("BLOQUE FROM", "EXISTE UNA COMA MAL UBICADA"));
                            }
                        }

                    }
                }
            }
            else
            {
                if(!pila_identifica.isEmpty())
                {
                    nodo_aux = new BTree(pila_identifica.pop());
                }
                else
                {
                    lista_errores_from.add(new Error("BLOQUE FROM", "DEBE EXISTIR UN IDENTIFICADOR DE CAMPO EN ESTE BLOQUE"));
                }
            }
        }
        return nodo_aux;
//        BTree nodo_aux = new BTree(null);
//
//        if(nodo_padre.getElement() == "nulo")
//        {
//            nodo_aux = new BTree(pila_pal_reserv.pop());
//            try
//            {
//                /*
//                 * AQUI SE DEBE HACER LA PRIMERA LLAMADA RECURSIVA
//                 */
//                if(!pila_simbolos.empty())
//                {
//                    nodo_aux.insertar(generarSubArbolFrom(nodo_aux), BTree.LADO_DRCHO);
//                    nodo_aux.insertar(generarSubArbolFrom(nodo_aux), BTree.LADO_IZDO);
//                }
//                else
//                {
//                    nodo_aux.insertar(generarSubArbolFrom(nodo_aux), BTree.LADO_IZDO);
//                    nodo_aux.insertar(new BTree(new Lexema(0, null)), BTree.LADO_DRCHO);
//                }
//            }
//            catch (BTreeException ex)
//            {
//                System.out.println(ex.getMessage());
//            }
//        }
//        else
//        {
//            /*
//             * AQUI SE VERIFICA QUE LA PILA DE SIMBOLOS NO ESTE VACIA
//             */
//            if(!pila_simbolos.empty())
//            {
//                if( (((Lexema)nodo_padre.getElement()).getLexema()).toUpperCase().equals("FROM") )
//                {
//                    if(nodo_padre.getDerecha() == null)
//                    {
//                        nodo_aux = new BTree(new Lexema(0, null));
//                    }
//                    else
//                    {
//                        nodo_aux = new BTree(pila_simbolos.pop());
//                        try
//                        {
//                            nodo_aux.insertar(generarSubArbolFrom(nodo_aux), BTree.LADO_DRCHO);
//                            nodo_aux.insertar(generarSubArbolFrom(nodo_aux), BTree.LADO_IZDO);
//                        }
//                        catch (BTreeException ex)
//                        {
//                            System.out.println(ex.getMessage());
//                        }
//                    }
//                }
//                else
//                {
//                    if(nodo_padre.getDerecha() == null)
//                    {
//                        nodo_aux = new BTree(pila_identifica.pop());
//                    }
//                    else
//                    {
//                        nodo_aux = new BTree(pila_simbolos.pop());
//                        try
//                        {
//                            nodo_aux.insertar(generarSubArbolFrom(nodo_aux), BTree.LADO_DRCHO);
//                            nodo_aux.insertar(generarSubArbolFrom(nodo_aux), BTree.LADO_IZDO);
//                        }
//                        catch (BTreeException ex)
//                        {
//                            System.out.println(ex.getMessage());
//                        }
//                    }
//                }
//            }
//            else
//            {
//                if(!pila_identifica.isEmpty())
//                {
//                    nodo_aux = new BTree(pila_identifica.pop());
//                }
//            }
//        }
//        return nodo_aux;
    }

    /**
     * @return the lista_errores_from
     */
    public ArrayList getLista_errores_from() {
        return lista_errores_from;
    }

    /**
     * @param lista_errores_from the lista_errores_from to set
     */
    public void setLista_errores_from(ArrayList lista_errores_from) {
        this.lista_errores_from = lista_errores_from;
    }

}
